package org.lc.platform.mybatis.manager.relation;

import cn.hutool.core.util.ReflectUtil;
import org.lc.platform.mybatis.manager.query.QueryBuilder;

import java.util.List;
import java.util.Map;

import static java.util.stream.Collectors.*;

public class BaseRelation<T> {
    protected List<T> data;
    protected Relation relation;
    protected List<Map<String, Object>> relationList = List.of();

    /**
     * 获取单元
     * 素列表
     */
    protected List<Object> getSetList(List<?> result, String field) {
        return result.stream().map((r) -> getReflectValue(r, field)).collect(toSet()).stream().toList();
    }

    /**
     * 通过反射根据字段名
     * 获取对象实体
     * 该字段对应的值
     */
    protected Object getReflectValue(Object source, String field) {
        return ReflectUtil.getFieldValue(source, field);
    }


    /**
     * 获取数据列表
     */
    protected List<?> getQueryResult(Class<?> cls, String field, List<?> val) {
        var wrapper = new QueryBuilder<>(cls, this.relationList).in(field, val);
        return wrapper.list();
    }

    /**
     * 通过某个字段值
     * 对某个列表进行分组
     * 在根据所需字段形成新的对象列表
     */
    protected Map<Object, ? extends List<?>> getGroupByData(List<?> result, String field, String key) {
        return result.stream().collect(groupingBy(r -> getReflectValue(r, field).toString(), mapping(e -> getReflectValue(e, key), toList())));
    }

    protected Map<Object, List<Object>> getGroupByData(List<?> result, String field) {
        return result.stream().collect(groupingBy(r -> getReflectValue(r, field).toString()));
    }

    protected void setReflectValue(Object source, String field, Object val) {
        ReflectUtil.setFieldValue(source, field, val);
    }


}
